home *** CD-ROM | disk | FTP | other *** search
/ Night Owl 7 / Night Owl Shareware (NOPV7)(Night Owl Publisher Inc.)(1992).bin / 038a / bash1_12.arj / BASH1-12.TAR / bash-1.12 / builtins / exit.def < prev    next >
Text File  |  1991-07-12  |  3KB  |  135 lines

  1. This file is exit.def, from which is created exit.c.
  2. It implements the builtins "bye" and  "exit", and "logout" in Bash.
  3.  
  4. Copyright (C) 1987, 1989, 1991 Free Software Foundation, Inc.
  5.  
  6. This file is part of GNU Bash, the Bourne Again SHell.
  7.  
  8. Bash is free software; you can redistribute it and/or modify it under
  9. the terms of the GNU General Public License as published by the Free
  10. Software Foundation; either version 1, or (at your option) any later
  11. version.
  12.  
  13. Bash is distributed in the hope that it will be useful, but WITHOUT ANY
  14. WARRANTY; without even the implied warranty of MERCHANTABILITY or
  15. FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  16. for more details.
  17.  
  18. You should have received a copy of the GNU General Public License along
  19. with Bash; see the file COPYING.  If not, write to the Free Software
  20. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  21.  
  22. $PRODUCES exit.c
  23.  
  24. $BUILTIN exit
  25. $FUNCTION exit_builtin
  26. $SHORT_DOC exit [n]
  27. Exit the shell with a status of N.  If N is omitted, the exit status
  28. is that of the last command executed.
  29. $END
  30.  
  31. $BUILTIN bye
  32. $FUNCTION exit_builtin
  33. $SHORT_DOC bye [n]
  34. Synonym for exit.
  35. $END
  36.  
  37. #include <stdio.h>
  38. #include <sys/types.h>
  39. #include "../shell.h"
  40. #include "../jobs.h"
  41.  
  42. #if defined (JOB_CONTROL)
  43. extern int jobs_builtin ();
  44. #endif /* JOB_CONTROL */
  45. extern int interactive;
  46.  
  47. int
  48. exit_builtin (list)
  49.      WORD_LIST *list;
  50. {
  51.   extern int login_shell;
  52.  
  53.   if (interactive)
  54.     {
  55.       fprintf (stderr, login_shell ? "logout\n" : "exit\n");
  56.       fflush (stderr);
  57.     }
  58.  
  59.   return (exit_or_logout (list));
  60. }
  61.  
  62. $BUILTIN logout
  63. $FUNCTION logout_builtin
  64. $SHORT_DOC logout
  65. Logout of a login shell.
  66. $END
  67.  
  68. /* How to logout. */
  69. int
  70. logout_builtin (list)
  71.      WORD_LIST *list;
  72. {
  73.   if (!login_shell && interactive)
  74.     {
  75.       builtin_error ("Not login shell: use `exit' or `bye'");
  76.       return (EXECUTION_FAILURE);
  77.     }
  78.   else
  79.     return (exit_or_logout (list));
  80. }
  81.  
  82. /* Clean up work for exiting or logging out. */
  83. Function *last_shell_builtin = (Function *)NULL;
  84. Function *this_shell_builtin = (Function *)NULL;
  85.  
  86. exit_or_logout (list)
  87.      WORD_LIST *list;
  88. {
  89.   extern int last_command_exit_value;
  90.   int exit_value;
  91.  
  92. #if defined (JOB_CONTROL)
  93.   int exit_immediate_okay;
  94.  
  95.   exit_immediate_okay = (!interactive ||
  96.              last_shell_builtin == exit_builtin ||
  97.              last_shell_builtin == logout_builtin ||
  98.              last_shell_builtin == jobs_builtin);
  99.  
  100.   /* Check for stopped jobs if the user wants to. */
  101.   if (!exit_immediate_okay)
  102.     {
  103.       register int i;
  104.       for (i = 0; i < job_slots; i++)
  105.     if (jobs[i] && (jobs[i]->state == JSTOPPED))
  106.       {
  107.         fprintf (stderr, "There are stopped jobs.\n");
  108.  
  109.         /* This is NOT superfluous because EOF can get here without
  110.            going through the command parser.  Set both last and this
  111.            so that either `exit', `logout', or ^D will work to exit
  112.            immediately if nothing intervenes. */
  113.         this_shell_builtin = last_shell_builtin = exit_builtin;
  114.         return (EXECUTION_FAILURE);
  115.       }
  116.     }
  117. #endif /* JOB_CONTROL */
  118.  
  119.   /* Get return value if present.  This means that you can type
  120.      `logout 5' to a shell, and it returns 5. */
  121.   if (list)
  122.     exit_value = get_numeric_arg (list);
  123.   else
  124.     exit_value = last_command_exit_value;
  125.  
  126.   /* Run our `~/.bash_logout' file if it exists, and this is a login shell. */
  127.   if (login_shell)
  128.     maybe_execute_file ("~/.bash_logout");
  129.  
  130.   last_command_exit_value = exit_value;
  131.  
  132.   /* Exit the program. */
  133.   longjmp (top_level, EXITPROG);
  134. }
  135.